﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLUsuario : BLBase
    {
        // Representa o objeto de acesso a dados
        private DAUsuario da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLUsuario() : base("DEFAULT")
        {
            da = new DAUsuario("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLUsuario(string tenantId)
            :base(tenantId)
        {
            da = new DAUsuario(tenantId);
        }

        /// <summary>
        /// Insere um usuário de negócio
        /// </summary>
        /// <param name="entity">Entidade usuário</param>
        public void inserirUsuario(USUARIO entity)
        {
            try
            {
                da.inserirUsuario(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }
        /// <summary>
        /// Atualiza um usuário
        /// </summary>
        /// <param name="user">Entidade usuário</param>
        public void atualizarUsuario(USUARIO user)
        {
            try
            {
                this.da.atualizarUsuario(user);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Obtem um usuário
        /// </summary>
        /// <param name="id">Identificador do usuário</param>
        /// <returns>Usuário</returns>
        public USUARIO obterUsuario(Guid id)
        {
            USUARIO retorno = null;

            try
            {
                retorno = this.da.obterUsuario(id);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Exclui um usuário
        /// </summary>
        /// <param name="idUsuario">Identificador do usuário</param>
        public void excluirUsuario(Guid idUsuario)
        {
            try
            {      
                // Desassocia os contratos do usuário
                desassociarContratosUsuario(obterUsuarioContratos(idUsuario));

                this.da.excluirUsuario(idUsuario);
            }
            catch (BLException blex)
            {
                throw blex;
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }


        /// <summary>
        /// Associa uma lista de contratos a usuários
        /// </summary>
        /// <param name="listUsersContracts">Lista de contratos associadosa usuários</param>
        public void associarContratosUsuario(List<USUARIO_CONTRATO> listUsersContracts)
        {
            try
            {
                this.da.associarContratosUsuario(listUsersContracts);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Desassocia uma lista de contratos de um usuário
        /// </summary>
        /// <param name="listUsersContracts">Lista de contratos associados ao usuário</param>
        public void desassociarContratosUsuario(List<USUARIO_CONTRATO> listUsersContracts)
        {
            try
            {
                this.da.desassociarContratosUsuario(listUsersContracts);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Obtem a lista de contratos de um usuário
        /// </summary>
        /// <param name="idUsuario">Identificar do usuário</param>
        /// <returns>Lista de contratos</returns>
        public List<CONTRATO> obterContratosUsuario(Guid idUsuario)
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.da.obterContratosUsuario(idUsuario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem uma lista de usuário associado a contratos
        /// </summary>
        /// <param name="idUsuario">Identificador do usuário</param>
        /// <returns></returns>
        public List<USUARIO_CONTRATO> obterUsuarioContratos(Guid idUsuario)
        {
            List<USUARIO_CONTRATO> retorno = null;

            try
            {
                retorno = this.da.obterUsuarioContratos(idUsuario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os contratos de um usuário
        /// </summary>
        /// <param name="idUsuario">Identificar do usuário</param>
        /// <returns>Lista de contratos</returns>
        public List<TOCombo> listarContratosUsuarioCombo(Guid idUsuario)
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarContratosUsuarioCombo(idUsuario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }
        
        /// <summary>
        /// Lista os contratos de um usuário
        /// </summary>
        /// <param name="idUsuario">Identificar do usuário</param>
        /// <returns>Lista de contratos</returns>
        public List<CONTRATO> listarContratosAssociados(Guid idUsuario)
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.da.listarContratosAssociados(idUsuario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os contratos que não são de um usuário
        /// </summary>
        /// <param name="idUsuario">Identificar do usuário</param>
        /// <returns>Lista de contratos</returns>
        public List<CONTRATO> listarContratosNaoAssociados(Guid idUsuario)
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.da.listarContratosNaoAssociados(idUsuario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os usuários
        /// </summary>
        /// <returns>Lista de usuários</returns>
        public List<USUARIO> listarUsuarios()
        {
            List<USUARIO> retorno = null;

            try
            {
                retorno = this.da.listarUsuarios();
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }
    }
}
